#include <QBuffer>
#include <QDir>
#include <QImageReader>

#include "../global/QmlNames.h"
#include "../config/config.h"
#include "Singleton.h"
#include "PhotoUtil.h"

X_BEGIN_NAMESPACE

char PhotoUtil::QML_NAME[] = "XPhotoUtil";

PhotoUtil::PhotoUtil()
    : QObject(NULL)
{
}

PhotoUtil &PhotoUtil::instance()
{
    return *Singleton<PhotoUtil>::instance(PhotoUtil::createInstance);
}

const char* PhotoUtil::qmlName()
{
    return QmlNames::Utils::PhotoUtilSingleton;
}

QObject *PhotoUtil::qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine);
    Q_UNUSED(scriptEngine);

    return &instance();
}

/**
 * @brief 按bareJid保存头像照片到本地。
 *
 * TODO: 可以考虑生成不同尺寸的图片，如：列表头像生成24*24，全尺寸的保存原来大小，
 * 这样可以提高渲染的速度，优化内存使用。
 *
 * @param data
 * @param bareJid
 */
QString PhotoUtil::saveToLocalByBareJid(QByteArray photo, QString bareJid)
{
    QString userName = bareJid.split("@")[0];
    QString VCardsPath = Config::instance().storagePath(bareJid, Config::VCards);

    QString name(VCardsPath + userName + ".png");
    QBuffer buffer;
    buffer.setData(photo);
    buffer.open(QIODevice::ReadOnly);
    QImageReader imageReader(&buffer);
    QImage image = imageReader.read();
    if(!image.save(name)){
        qDebug() <<"vCard: Photo save failed for user " << bareJid;
    }

    return name;
}

/**
 * @brief 为源文件创建缩略图。如果缩略图的长宽大于原始文件，直接返回原始文件路径。如果文件已存在，直接返回。
 *
 * @param originFile
 * @return
 */
QString PhotoUtil::createThumbnail(const QString &originFile, int width, int height)
{
    // 已存在，直接返回缩略图文件
    int lastDotPos = originFile.lastIndexOf('.', -1, Qt::CaseSensitive);
    QString fileName = originFile.midRef(0, lastDotPos) + "_thumbnail" + originFile.midRef(lastDotPos, originFile.size() - 1);
    if(QFile::exists(fileName)) return fileName;

    // 生成缩略图
    m_pixmap.load(originFile);
    QSize pixmapSize = m_pixmap.size();
    if(pixmapSize.width() > pixmapSize.width()){
        if(pixmapSize.width() < width){
            return originFile;
        }
    } else {
        if(pixmapSize.height() < height){
            return originFile;
        }
    }

    QPixmap pixmap = m_pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    if(!pixmap.save(fileName)){
        qDebug() << "Create thumbnail failed for image: " << originFile;
    }

    m_pixmap.detach();
    return fileName;
}

PhotoUtil *PhotoUtil::createInstance()
{
     return new PhotoUtil();
}

X_END_NAMESPACE
